package com.ts.api.http.user.real;

import com.alibaba.fastjson2.JSONObject;
import com.gitee.apanlh.util.base.Eq;
import com.gitee.apanlh.util.base.MapUtils;
import com.gitee.apanlh.util.id.IdUtils;
import com.gitee.apanlh.util.log.LogLevel;
import com.gitee.apanlh.util.net.http.HttpClientBuilder;
import com.gitee.apanlh.util.net.http.HttpResponse;
import com.gitee.apanlh.web.http.HttpMethod;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 *  华道二要素验证
 *
 *  @author Pan
 */
@Component
public class HdUserUserRealAuthProvider implements UserRealAuthProvider {

    /**
     * ACCESS_TOKEN<br />
     * 可以通过下面的地址获取，三年一换 <br />
     * https://opensdk.bihootech.com/HD_GetAccess_Token.asmx/GetACCESS_TOKEN?AppID=EBDP-BD1-4LC8K&AppSecret=2EF27ABAE6FCE89E
     */
    public static final String ACCESS_TOKEN = "5F9AA5306DE6478C86B2DFA1D6A946B7";

    /**
     * (姓名+身份证)接口地址
     */
    public static final String NAME_AND_IDCARD_URL = "http://opensdk.bihootech.com/HD_EBDP/EMW/Get_EMW_GetIdcard_RZ";;

    /**
     * (姓名+手机号)接口地址
     */
    public static final String NAME_AND_PHONE_URL = "http://opensdk.bihootech.com/HD_EBDP/EMW/Get_EMW059_GetAll_Operator_TwoElements";


    @Override
    public Boolean nameAndIdcard(String name, String idcard) {
        Map<String, Object> requestBodyMap = MapUtils.newHashMap(newMap -> {
            // 姓名（支持少数民族姓名验证，名字中的点是中文点·）
            newMap.put("NAME", name);
            // 身份证号
            newMap.put("IDCARD", idcard);
            // 有效凭证
            newMap.put("ACCESS_TOKEN", ACCESS_TOKEN);
            // 客户端生成唯一请求流水号，长度不超过 50个字符
            newMap.put("TRANS_ID", IdUtils.getSimpleUuid());
        });

        HttpResponse httpResponse = HttpClientBuilder.builder(NAME_AND_IDCARD_URL, HttpMethod.POST)
                .withBodyForm(requestBodyMap)
                .withLogLevel(LogLevel.WARN)
                .withErrorLogLevel(LogLevel.WARN)
                .build();

        String str = httpResponse.getStr();

        JSONObject jsonObject = JSONObject.parseObject(str);

        if (jsonObject == null) {
            return false;
        }

        // 提交状态，200（正常）
        String CODE = jsonObject.getString("CODE");
        // 姓名（输入项）
//        String NAME = jsonObject.getString("NAME");
        // 手机号（输入项）
//        String PHONE = jsonObject.getString("PHONE");
        // 请求流水号
//        String TRANS_ID = jsonObject.getString("TRANS_ID");
        // 是否计费，Y（是）/N（否）
//        String FEE = jsonObject.getString("FEE");
        // 结果状态：
        // 1：认证信息匹配
        // 2：认证信息不匹配
        // 3：无法验证
        // -1：异常状态
        String RESULT = jsonObject.getString("RESULT");
        // 结果说明
//        String RESULTDESC = jsonObject.getString("RESULTDESC");
        // 运营商
        // 1、移动
        // 2、联通
        // 3、电信
//        String EXT1 = jsonObject.getString("EXT1");
        // 扩展字段（暂不用）
//        String EXT2 = jsonObject.getString("EXT2");

        // 错误代码
//        Integer errcode = jsonObject.getInteger("errcode");
        // 错误信息说明
//        String errmsg = jsonObject.getString("errmsg");
        // 服务端超 5s 自动断开连接返回 "EB_ERR"
//        String EB_ERR = jsonObject.getString("EB_ERR");

        if (Eq.str(CODE, "200") && Eq.str(RESULT, "1")) {
            return true;
        }
        return false;
    }

    @Override
    public Boolean nameAndPhone(String name, String phone) {

        Map<String, Object> requestBodyMap = MapUtils.newHashMap(newMap -> {
            // 姓名（明文）
            newMap.put("NAME", name);
            // 手机号（明文）
            newMap.put("PHONE", phone);
            // 有效凭证
            newMap.put("ACCESS_TOKEN", ACCESS_TOKEN);
            // 客户端生成唯一请求流水号，长度不超过 50个字符
            newMap.put("TRANS_ID", IdUtils.getSimpleUuid());
        });

        HttpResponse httpResponse = HttpClientBuilder.builder(NAME_AND_PHONE_URL, HttpMethod.POST)
                .withBodyForm(requestBodyMap)
                .withLogLevel(LogLevel.WARN)
                .withErrorLogLevel(LogLevel.WARN)
                .build();

        String str = httpResponse.getStr();

        JSONObject jsonObject = JSONObject.parseObject(str);

        if (jsonObject == null) {
            return false;
        }

        // 提交状态，200（正常）
        String CODE = jsonObject.getString("CODE");
        // 姓名
//        String NAME = jsonObject.getString("NAME");
        // 身份证号
//        String IDCARDCODE = jsonObject.getString("IDCARDCODE");
        // 请求流水号
//        String TRANS_ID = jsonObject.getString("TRANS_ID");
        // 是否计费，Y（是）/N（否）
//        String FEE = jsonObject.getString("FEE");
        // 验证状态：
        // 1：一致
        // 2 : 不一致
        // 3：无记录
        // -1：异常状态
        String RESULT = jsonObject.getString("RESULT");
        // 结果说明
//        String RESULTDESC = jsonObject.getString("RESULTDESC");

        // 错误代码
//        Integer errcode = jsonObject.getInteger("errcode");
        // 错误信息说明
//        String errmsg = jsonObject.getString("errmsg");
        // 服务端超 5s 自动断开连接返回 "EB_ERR"
//        String EB_ERR = jsonObject.getString("EB_ERR");

        if (Eq.str(CODE, "200") && Eq.str(RESULT, "1")) {
            return true;
        }
        return false;
    }
}
